package com.example.service.impl;

import com.example.mapper.oilPointMapp;
import com.example.pojo.Result;
import com.example.pojo.oilPointPojo;
import com.example.service.oilPointService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.UUID;

/**
 * ClassName:oilPoint
 * Description:
 *
 * @Author 赵永峰
 * @Create 2024/6/23 20:57
 * @Version 1.0
 */
@Service//注解：表示把这个注入到了ben中。
@Slf4j//可以输出注解

public class oilPointImpl implements oilPointService {
    @Autowired
    private oilPointMapp oilPointMapp;
    @Value("${file.upload-dir}")
    private String saveDir;

    //插入一条完整的记录
    public void insertOne(oilPointPojo oilPoint) {
        //组合创建时间和修改时间
        oilPoint.setEstablishTime(LocalDateTime.now());
        oilPoint.setUpdateTime(LocalDateTime.now());
        oilPointMapp.insertOne(oilPoint);
    }

    //查询所有的列表信息
    public List<oilPointPojo> selectAllList() {
        List<oilPointPojo> oilPointPojoList = oilPointMapp.selectAllList();
        return oilPointPojoList;
    }

    //修改某一行的数据
    public void ilPointUpListOne(oilPointPojo oilPoint) {
        oilPointMapp.ilPointUpListOne(oilPoint);
    }

    //上传加油点位置照片的控制层
    public String oilPointAnnex(MultipartFile file, Integer id, String oilPointAnnex) {
        try {
            // 记录文件名，并返回
            String fileNameAll = null;
            if (!file.isEmpty()) {
                // 生成文件的唯一名称以避免冲突
                String fileName = UUID.randomUUID() + "&&" + file.getOriginalFilename();
                String filePath = saveDir + fileName;
                File dest = new File(filePath);
                // 将文件保存到服务器上的指定位置
                file.transferTo(dest);
                // 将以前的文件名称与新的文件名称组合
                fileNameAll = oilPointAnnex + fileName + "|*|";
                // 将数据写入到数据库中
                LocalDateTime dateTime = LocalDateTime.now();
                oilPointMapp.iolPointOneField(id, "oilPointAnnex", fileNameAll, dateTime);
            }
            // 如果文件不为空且未发生异常，返回文件名列表
            return fileNameAll;
        } catch (IOException e) {
            // 捕获异常并返回错误消息
            throw new RuntimeException("文件保存失败：" + e.getMessage());
        }
    }
    //上传加油点作业指导书照片的控制层
    public String oilBooKAnnex(MultipartFile file, Integer id, String oilPointAnnex){
        try {
            // 记录文件名，并返回
            String fileNameAll = null;
            if (!file.isEmpty()) {
                // 生成文件的唯一名称以避免冲突
                String fileName = UUID.randomUUID() + "&&" + file.getOriginalFilename();
                String filePath = saveDir + fileName;
                File dest = new File(filePath);
                // 将文件保存到服务器上的指定位置
                file.transferTo(dest);
                // 将以前的文件名称与新的文件名称组合
                fileNameAll = oilPointAnnex + fileName + "|*|";
                // 将数据写入到数据库中
                LocalDateTime dateTime = LocalDateTime.now();
                oilPointMapp.iolPointOneField(id, "bookAnnex", fileNameAll, dateTime);
            }
            // 如果文件不为空且未发生异常，返回文件名列表
            return fileNameAll;
        }
        catch (IOException e) {
            // 捕获异常并返回错误消息
            throw new RuntimeException("文件保存失败：" + e.getMessage());
        }
    }
    //读取文件，发向前端，进行数据下载保存
    public byte[] readFile(String fileName) {
        File file = new File(saveDir + fileName);
        // 检查文件是否存在且可读
        if (file.exists() && file.canRead()) {
            try (FileInputStream fis = new FileInputStream(file)) {
                // 读取文件内容到byte[]数组中
                byte[] fileContent = fis.readAllBytes();
                return fileContent; // 返回文件内容的byte[]数组
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 如果文件不存在或不可读，或者读取时发生异常，返回null
        System.out.println("文件不存在或不可读：" + file.getAbsolutePath());
        return null;
    }
    //删除文件的函数，现在还不正在的删除，只是做了一个删除数据库中的记录数据
    public String oilPictureRemove(Map<String, Object> parameters){
        Integer id=(Integer) parameters.get("id");
        String fieldName=(String) parameters.get("fieldName");
        String filedValue=(String) parameters.get("filedValue");
        String pictureName=(String) parameters.get("pictureName");
        //删除文件
        String filePath =saveDir+pictureName; // 替换为你的文件路径
        // 使用 Paths 类的静态方法 get 来根据给定的文件路径字符串 filePath 创建一个 Path 对象
        Path path = Paths.get(filePath);
        try {
            // 使用 Files 类的 delete 方法删除指定的文件
            Files.delete(path);
            //修改数据库
            // 将数据写入到数据库中
            LocalDateTime dateTime = LocalDateTime.now();
            System.out.println(filedValue);
            oilPointMapp.iolPointOneField(id, fieldName, filedValue, dateTime);
            return filedValue;
        } catch (IOException e) {
            System.err.println("删除文件时出错: " + e.getMessage());
            return "删除文件时出错";
        }
    }
    //修改一个字段，传来的参数是需要修改的ID，字段名称，字段变量，修改的是字符串变量
    public String editOilOneFieldText(Map<String, Object> parameters){
        Integer id=(Integer) parameters.get("id");
        String fieldName= (String) parameters.get("fieldName");
        String fieldValue =(String) parameters.get("fieldValue");
        LocalDateTime dateTime = LocalDateTime.now();
        System.out.println("到这里了");
        System.out.println(fieldName);
        oilPointMapp.iolPointOneField(id,fieldName,fieldValue,dateTime);
        return fieldValue;
    }
}